package Repositorio;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import ClassesBasicas.Estadio;
import Conexao.GConexao;
import Conexao.IConexao;
import erro.ConexaoException;
import erro.RepositorioException;



/**
 * Camada de acesso aos dados da classe Estadio no modelo DAO 
 *      
 * @author Leyla
 *
 */

public class RepEstadio implements IRepEstadio{
    /* Representa o GConexão */
          
    private IConexao conexao;
    
    /**
     * Quando o objeto RepEstadio for instanciado, este construtor irá instanciar o GConexao.
     */
    
    public RepEstadio(){
        conexao = GConexao.getInstancia();
    }
        
    /**
     * Insere um Estádio no Banco de Dados
     * 
     * @throws ConexaoException, RepositorioException
     * @param Estadio
     */
        
     @Override
     public void salvar(Estadio est) throws ConexaoException, RepositorioException {
         Connection c = conexao.conectar();
         
         String sqlSalvarEst = "INSERT INTO Estadio(nome_Estadio,local_Estadio,pais_cod_pais) values(?,?,?)";
         try{
             PreparedStatement pstm = c.prepareStatement(sqlSalvarEst);
             pstm.setString(1, est.getNomeEstadio());
             pstm.setString(2, est.getLocalEstadio());
             pstm.setInt(3, est.getCodPais());
             pstm.executeUpdate();
             pstm.close();
         }
         
         catch(SQLException e){
             throw new RepositorioException(e.getMessage());
         }
         finally{
             conexao.desconectar(c);
         }
     }

     /**
      * Consulta um Estádio pelo código e retorna um Estádio
      * 
      * @param codEstadio
      * @return
      * @throws ConexaoException
      * @throws RepositorioException 
      */
     
     @Override
     public Estadio consultarCod(int codEstadio) throws ConexaoException,RepositorioException {
         Estadio est = null;
         
         Connection c = conexao.conectar();
         
         String sqlConsultEstById = "SELECT cod_Estadio,nome_Estadio,local_Estadio,Pais_cod_pais FROM Estadio WHERE(cod_Estadio = ?) ";
         
         try {
             PreparedStatement pstm = c.prepareStatement(sqlConsultEstById);
             pstm.setInt(1,codEstadio);
             ResultSet result = pstm.executeQuery();
                        
             if(result.next()){
                 est = new Estadio();
                 est.setCodEstadio(result.getInt("cod_Estadio"));
                 est.setNomeEstadio(result.getString("nome_Estadio"));
                 est.setLocalEstadio(result.getString("local_Estadio"));
                 est.setCodPais(result.getInt("Pais_cod_Pais"));
             }
                        
         } catch (SQLException e) {
             throw new RepositorioException(e.getMessage());
         }
         finally{
             conexao.desconectar(c);
         }
         return est;
       
     }
     
     /**
      * Alterar um Estádio pelo código.
      * 
      * @param est
      * @throws ConexaoException
      * @throws RepositorioException 
      */
     
    @Override
     public void alterar(Estadio est) throws ConexaoException, RepositorioException{
         Connection c = conexao.conectar();
         
         String sqlAlterarEstByID;
         
         sqlAlterarEstByID = "UPDATE Estadio SET nome_Estadio =? WHERE (cod_Estadio=?)";
         
         try {
             PreparedStatement pstm = c.prepareStatement(sqlAlterarEstByID);
             pstm.setString(1, est.getNomeEstadio());
             pstm.setInt(2, est.getCodEstadio());
             pstm.executeUpdate();
             pstm.close();
         }
         
         catch (SQLException e){
             throw new RepositorioException();
         }
         finally{
             conexao.desconectar(c);
         }
        
     }
        
    /**
     * Consulta um Estadio pelo nome
     * 
     * @param nomeEstadio
     * @return
     * @throws ConexaoException
     * @throws RepositorioException 
     */
     
    @Override
    public Estadio consultarNome(String nomeEstadio) throws ConexaoException,RepositorioException {
            Estadio est = null;

            Connection c = conexao.conectar();

            String sqlConsultEstById = "SELECT cod_Estadio,nome_Estadio,local_Estadio,Pais_cod_pais FROM Estadio WHERE(nome_Estadio = ?) ";

            try {
                    PreparedStatement pstm = c.prepareStatement(sqlConsultEstById);
                    pstm.setString(1,nomeEstadio);
                    ResultSet result = pstm.executeQuery();

                    if(result.next()){
                            est = new Estadio();
                            est.setCodEstadio(result.getInt("codEstadio"));
                            est.setNomeEstadio(result.getString("nomeEstadio"));
                            est.setNomeEstadio(result.getString("localEstadio"));
                            est.setCodPais(result.getInt("Pais_cod_Pais"));
                    }

            } catch (SQLException e) {
                    throw new RepositorioException(e.getMessage());
            }
            finally{
                    conexao.desconectar(c);
            }
            return est;
    }
      
        /**
         * Exclui um Estádio pelo código
         * 
         * @param codEstadio
         * @throws ConexaoException
         * @throws RepositorioException 
         */
    
        @Override
        public void excluirCod(int codEstadio) throws ConexaoException,RepositorioException  {
                
                Connection c = conexao.conectar();
                
                String sqlExcluirEst = "DELETE FROM Estadio WHERE(cod_Estadio = ?)";
                
                try {
                        PreparedStatement pstm = c.prepareStatement(sqlExcluirEst);
                        pstm.setInt(1, codEstadio);
                        pstm.executeUpdate();
                        pstm.close();
                } catch (SQLException e) {
                        throw new RepositorioException(e.getMessage());
                }
                finally{
                        conexao.desconectar(c);
                }
        }
        
        /**
         * Exclui um Estádio pelo nome
         * 
         * @param String
         * @return void
         * @throws ConexaoException,RepositorioException
         */
        
    @Override
        public void excluirNome(String nomeEstadio) throws ConexaoException,RepositorioException{
                
                Connection c = conexao.conectar();
                
                String sqlExcluirEst = "DELETE FROM Estadio WHERE(nome_Estadio = ?)";
                
                try {
                        PreparedStatement pstm = c.prepareStatement(sqlExcluirEst);
                        pstm.setString(1, nomeEstadio);
                        pstm.executeUpdate();
                        pstm.close();
                } catch (SQLException e) {
                        throw new RepositorioException(e.getMessage());
                }
                finally{
                        conexao.desconectar(c);
                }
        }
        
        /**
         * Lista todos os Estádios
         * 
         * @return Collection<Estadio>
         * @throws ConexaoException,RepositorioException
         */
        
        @Override
        public Collection<Estadio> listar() throws ConexaoException,RepositorioException {
                Estadio est = null; 
                ArrayList<Estadio> lista = new ArrayList<Estadio>();
                
                Connection c = conexao.conectar();
                
                String sqlListaEst = "SELECT cod_Estadio, nome_Estadio, local_Estadio,Pais_Cod_Pais FROM Estadio";
                
                try {
                        PreparedStatement pstm = c.prepareStatement(sqlListaEst);
                        ResultSet result = pstm.executeQuery();
                        
                        while(result.next()){
                        	est = new Estadio();
                        	est.setCodEstadio(result.getInt(1));
                        	est.setNomeEstadio(result.getString(2));
                        	est.setLocalEstadio(result.getString(3));
                                est.setCodPais(result.getInt(4));
                        	lista.add(est);
                        }
                } catch (SQLException e) {
                        throw new RepositorioException(e.getMessage());
                }
                finally{
                        conexao.desconectar(c);
                }
                return lista;
        }
}